ÛÛÛÛ ÛÛÛÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ßÛÛÛÜ ÜÛÛÛß -= Demo Programming Series =- ßÛÛÛÜ ÜÛÛÛß by Sten Roger Sandvik ßÛÛÛÛÛß ÜÛÛÛßÛÛÛÜ I - HOW TO CREATE PLASMA EFFECTS ÜÛÛÛß ßÛÛÛÜ ÛÛÛÛ ÛÛÛÛ (c) 1994 by X3M Productions ÛÛÛÛ ÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Hey all out there, and welcome to part one of the X3M demo programming series. In this and all of the following demo programming series, I'll take it for granted that you know how to program the VGA controller, and some knowledge about X-mode. This time we'll discuss a psychadelic effect that is used in many demos. Yepp! You got it... Plasmas! Oki, no sence in wasting time here talking about bullshit... let's go to work!  The Workings of Plasmas In this text I will only cover the real type of plasma. No sills here, only state-of-the-art realtime plasma calculations! When you look at the method realtime plasmas is created, you'll see that it's merely an intersection of a number of cosinus waves. In this example we'll use 4 cosinus waves, which makes a very cool effect. The color of a particular point is calculated using this formula: color = costbl[cos_1]+costbl[cos_2]+costbl[cos_3]+costbl[cos_4] The trick is getting the four indexes of that cosinus table to create something that looks neat. We use two of the indexes for vertical movement, and the remaining two for horizontal movement. This means that by changing these valuse we can move along the plasma. To draw an individual screen, we pass the values of the four to another four so that we do not disturb the original values. For every pixel on the x-axis, we add values to the first two indexes, then displaying the next pixel. For every row down, we add values to the second two indexes. By altering the original four values, we can get all sorts of neat movement and cycling of the plasma. The reason we use a cosinus function is as follows: - Nice curvature. - Adding two or more together it's posible to get circular pictures.  Fading When you look at the sample demo, you'll see that when it fades in and out the colors all reach their destination at the same time. This is wery clever, if I may say so ? Well, in other words, they do not all increment by one until they hit the right color. If you should do it this way the fading looks extremely unproffesional.  How to do a step-crossfade Each red, green and blue values can be between 0 and 63. Have the palette we want to get to in TOPAL and the temporary palette in TEMPPAL. For each step, from 0 to 63 do the following: TEMPPAL[loop].red = TOPAL[loop].red * step / 64; TEMPPAL[loop].green = TOPAL[loop].green * step / 64; TEMPPAL[loop].blue = TOPAL[loop].blue * step / 64; That means if we are halfway through the crossfade (step=32) and the red value is meant to get to 16, then naturally the color would be value would be 8, which is half the way. This means all colors will fade in/out with the same ratios.  Palette rotating The palette rotating is very simple, so here is a brief description on how to do it. - Move color 0 into a temporary variable. - Move color 1 into color 0 - Move color 2 into color 1 . . - Move color 255 into color 254 - Move temporary color into color 255  About the sample demo The plasma sample demo code is written in pascal, and is (I think) self explanitory. I have also done an assembly version that you can look at, but the pascal code illustrates the plasma principle very clearly. Well if you have any questions about anything (Uhh... well about programming), just leave me a note. Be seein' YA! E-mail -> srs@alkymi.unit.no  ZIP file contents: PLASMA.TXT - The file you are looking at NOW! PLASMA.PAS - Pascal version of the sample code PLASMA.EXE - Executable version of the pascal version (Huh ?) COSTBL.INC - Cosinus table file for the assembler version PLASMEFF.ASM - Assembler version of the sample code (FAST!) PLASMEFF.EXE - Executable version of the assembler version!